package com.gameley.dmgtpf.common.utils;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * 处理和SQL语句相关的工具类
 *
 * @version 1.0<br>
 * @qualiFild nc.pub.itf.tools.sql.SQLHelper.java<br>
 * @author：licheng<br>
 * @date Created on 2019-8-12<br>
 */
public class SQLHelper implements PubConsUtil
{
    /**
     * *********************************************************** <br>
     * 说明： 用在拼接sql语句中，把一个单引号转译成两个单引号，以防止SQL注入，调用这个方法不用区分前后台代码<br>
     * 需要commons-lang-2.1.jar
     *
     * @String
     * @author licheng
     * @date Created on 2019年8月5日
     * @time 上午12:05:11
     * @version 1.0 <br>
     *          ************************************************************ <br>
     */
    public static String transfer(String strValue)
    {
        return StringUtil.replace(strValue, "'", "''");
    }
    
    /**
     * *********************************************************** <br>
     * 说明：
     *
     * @param strValues
     * @param iCount 每组只有 iCount 个值用来拼in的语句，如果为 -1，则不限长度
     * @return 把strValues数组中的合并成一个或者多个可以用于in语句的字符串，返回值形式：
     * @String
     * @author licheng
     * @date Created on 2019-7-19
     * @time 上午11:43:55
     * @version 1.0 <br>
     *          ************************************************************ <br>
     * @see
     */
    public static String joinToInSql(String strValues[], int iCount)
    {
        if (strValues == null || strValues.length == 0)
        {
            return null;
        }
        
        List<String> arrListInSQL = new ArrayList<String>();
        List<String> arrListExistValue = new ArrayList<String>();// 已经存在的值，以保证不重复
        
        StringBuilder strbdrInSQL = new StringBuilder();
        
        for (int i = 0, iIndex = 0; i < strValues.length; i++)
        {
            if (PubEnvUtil.isBlank(strValues[i]) || arrListExistValue.contains(strValues[i].trim()))
            {
                continue;
            }
            
            iIndex++;
            arrListExistValue.add(strValues[i].trim());
            
            strbdrInSQL.append(",'").append(transfer(strValues[i])).append("'");
            
            if (iCount == -1 && i == strValues.length - 1)
            {
                arrListInSQL.add(strbdrInSQL.substring(1));
                continue;
            }
            
            if (iIndex == iCount || i == strValues.length - 1)
            {
                if (strbdrInSQL.toString().trim().length() > 0)
                {
                    arrListInSQL.add(strbdrInSQL.substring(1));
                }
                
                iCount = 0;
                strbdrInSQL = new StringBuilder();
            }
        }
        
        if (strbdrInSQL.length() > 0 && !arrListInSQL.contains(strbdrInSQL.toString()))// 保证最后一个也在in语句的列表中
        {
            arrListInSQL.add(strbdrInSQL.substring(1));
        }
        
        return arrListInSQL.isEmpty() ? null : arrListInSQL.get(0);
    }
    
    /**
     * *********************************************************** <br>
     * 说明：
     *
     * @param strValues
     * @return 把strValues数组中的合并成一个或者多个可以用于in语句的字符串
     * @String[] @author licheng
     * @date Created on 2019-7-19
     * @time 上午11:43:08
     * @version 1.0 <br>
     *          ************************************************************ <br>
     * @see
     */
    protected static String[] joinToInSql(String... strValues)
    {
        if (strValues == null || strValues.length == 0)
        {
            return null;
        }
        
        int iCount = 100;// 每组只有100个值用来拼in的语句
        
        List<String> arrListInSQL = new ArrayList<String>();
        List<String> arrListExistValue = new ArrayList<String>();// 已经存在的值，以保证不重复
        
        StringBuilder strbdrInSQL = new StringBuilder();
        
        for (int i = 0, iIndex = 0; i < strValues.length; i++)
        {
            if (PubEnvUtil.isBlank(strValues[i]) || arrListExistValue.contains(strValues[i].trim()))
            {
                continue;
            }
            
            iIndex++;
            arrListExistValue.add(strValues[i].trim());
            
            strbdrInSQL.append(",'").append(strValues[i]).append("'");
            
            if (iIndex == iCount || i == strValues.length - 1)
            {
                if (strbdrInSQL.toString().trim().length() > 0)
                {
                    arrListInSQL.add(strbdrInSQL.substring(1));
                }
                
                iCount = 0;
                strbdrInSQL = new StringBuilder();
            }
        }
        
        if (strbdrInSQL.length() > 0 && !arrListInSQL.contains(strbdrInSQL.toString()))// 保证最后一个也在in语句的列表中
        {
            arrListInSQL.add(strbdrInSQL.substring(1));
        }
        
        return arrListInSQL.toArray(new String[0]);
    }
    
    /**
     * *********************************************************** <br>
     * *说明： <BR>
     * @param table
     * @param map
     * @param pkName
     * @return <BR>
     * @String <BR>
     * @methods SQLHelper.getInsertSQL <BR>
     * @author LiBencheng <BR>
     *         HXC067 <BR>
     * @date Created on 2021年7月30日 <BR>
     * @time 下午4:38:06 <BR>
     * @version 1.0 <BR>
     * @dmgtpf<BR>
     * @git_config <BR>
     * @see <BR>
     *************************************************************      <br>
     */
    public static String getInsertSQL(String table, Map<?, ?> map, String pkName)
    {
        StringBuffer into = new StringBuffer("INSERT INTO ").append(table).append(" (");
        StringBuffer value = new StringBuffer(" VALUES(");
        for (Map.Entry<?, ?> entry : map.entrySet())
        {
            into.append(entry.getKey()).append(",");
            value.append("'").append(map.get(entry.getKey())).append("',");
        }
        if (!ArrayUtil.isEmpty(pkName))
        {
            into.append(pkName).append(",");
            value.append("'").append(generatePrimaryKey()).append("',");
        }
        
        into.setLength(into.length() - 1);
        into.append(")");
        value.setLength(value.length() - 1);
        value.append(")");
        
        return into.append(value).toString();
    }
    
    /**
     * *********************************************************** <br>
     * *说明： <BR>
     * @return <BR>
     * @Long <BR>
     * @methods SQLHelper.generatePrimaryKey <BR>
     * @author LiBencheng <BR>
     *         HXC067 <BR>
     * @date Created on 2021年7月30日 <BR>
     * @time 下午4:38:14 <BR>
     * @version 1.0 <BR>
     * @dmgtpf<BR>
     * @git_config <BR>
     * @see <BR>
     *************************************************************      <br>
     */
    public static synchronized Long generatePrimaryKey()
    {
        return System.currentTimeMillis();
    }
}
